/*
 * @Descripttion: 
 * @version: 
 * @Author: HuangJunren
 * @Date: 2020-07-22 11:08:10
 * @LastEditors: HuangJunren
 * @LastEditTime: 2020-07-24 13:37:35
 */ 

#ifndef _SPDLOG_INTERFACE_H_
#define _SPDLOG_INTERFACE_H_

#include "spdlog_define.h"

#include <string>

#include "spdlog/spdlog.h"
#include "spdlog/sinks/basic_file_sink.h"
#include "spdlog/sinks/rotating_file_sink.h"
#include "spdlog/sinks/daily_file_sink.h"
#include "spdlog/async.h" //support for async logging.

typedef std::shared_ptr<spdlog::logger> pSpdlogger;

/** PASS
 * @name: spdlogger_ServerLogs_open
 * @msg: 为一个服务打开一个basic-log日志
 * @param 
 *  StrServerName: logger名称，
 *  type_log：     logger类型，
 *  SPDLOG_LEVEL_TYPE level：log级别，
 *  type_async：   是否支持异步，
 *  isDefault：    是否设定默认logger
 * @return: 
 *  SPD_COMMON_SUCCEED                (0)   (LONG)通用错误码宏定义，值为0，表示成功
 *  SPD_COMMON_FAIL                   (-1)  (LONG)通用错误码宏定义，值为-1，表示一般错误
 *  SPD_COMMON_INVAILD                (-2)  (LONG)通用错误码宏定义，值为-2，表示无效参数
 */
int spdlogger_ServerLogs4basic_open(std::string StrServerName, SPDLOG_LOG_TYPE type_log, _SPDLOG_LEVEL_TYPE level, SPDLOG_ASYNC_TYPE type_async, bool isDefault = false);

/** PASS
 * @name: spdlogger_ServerLogs_open
 * @msg: 为一个服务打开一个rotating-log日志
 * @param 
 *  StrServerName:          logger名称,
 *  type_log：              logger类型,
 *  type_async：            是否支持异步,
 *  isDefault：             是否设定默认logger,
 *  std::size_t max_size：  最大单文件大小，默认值：1024^2
 *  std::size_t max_files： 最大文件数量, 默认值：5
 * @return: 
 *  SPD_COMMON_SUCCEED                (0)   (LONG)通用错误码宏定义，值为0，表示成功
 *  SPD_COMMON_FAIL                   (-1)  (LONG)通用错误码宏定义，值为-1，表示一般错误
 *  SPD_COMMON_INVAILD                (-2)  (LONG)通用错误码宏定义，值为-2，表示无效参数
 */
int spdlogger_ServerLogs4rotating_open(std::string StrServerName, SPDLOG_LOG_TYPE type_log, _SPDLOG_LEVEL_TYPE level, SPDLOG_ASYNC_TYPE type_async, bool isDefault = false, std::size_t max_size = 1024*1024, std::size_t max_files = 5);

/** PASS
 * @name: spdlogger_ServerLogs_open
 * @msg: 为一个服务打开一个daily-log日志
 * @param 
 *  StrServerName: logger名称,
 *  type_log：     logger类型,
 *  type_async：   是否支持异步,
 *  isDefault：    是否设定默认logger
 * @return: 
 *  SPD_COMMON_SUCCEED                (0)   (LONG)通用错误码宏定义，值为0，表示成功
 *  SPD_COMMON_FAIL                   (-1)  (LONG)通用错误码宏定义，值为-1，表示一般错误
 *  SPD_COMMON_INVAILD                (-2)  (LONG)通用错误码宏定义，值为-2，表示无效参数
 */
int spdlogger_ServerLogs4daily_open(std::string StrServerName, SPDLOG_LOG_TYPE type_log, _SPDLOG_LEVEL_TYPE level, SPDLOG_ASYNC_TYPE type_async, bool isDefault = false, int hour = 0, int minute = 0);

/** PASS
 * @name: spdlogger_ServerLogs_get
 * @msg: 获得一个已经被创建的服务logger，get服务性能较低，不要在高并发状态下多次调用，影响性能
 * @param 
 * string StrServerName： logger名称
 * @return: 
 *  返回StrServerName对应的shard_ptr
 *  否则返回nullptr
 */
pSpdlogger spdlogger_ServerLogs_get(std::string StrServerName);

/** PASS
 * @name: spdlogger_ServerLogs_drop
 * @msg: 移除一个注册过的logger
 * @param 
 * string StrServerName： logger名称 
 * @return: 
 *  SPD_COMMON_SUCCEED                (0)   (LONG)通用错误码宏定义，值为0，表示成功
 *  SPD_COMMON_FAIL                   (-1)  (LONG)通用错误码宏定义，值为-1，表示一般错误
 *  SPD_COMMON_INVAILD                (-2)  (LONG)通用错误码宏定义，值为-2，表示无效参数
 */
int spdlogger_ServerLogs_drop(std::string StrServerName);

/** 
 * @name: spdlogger_ServerLogs_dropall
 * @msg: 移除全部注册过的logger
 * @param {type} 
 * @return: 
 *  SPD_COMMON_SUCCEED                (0)   (LONG)通用错误码宏定义，值为0，表示成功
 *  SPD_COMMON_FAIL                   (-1)  (LONG)通用错误码宏定义，值为-1，表示一般错误
 *  SPD_COMMON_INVAILD                (-2)  (LONG)通用错误码宏定义，值为-2，表示无效参数
 */
int spdlogger_ServerLogs_dropall();

/**
 * @name: spdlogger_printf
 * @msg: 通过StrServerName发送log消息（由于使用GET方法，在高并发场合下性能不高）
 * @param 
 * string StrServerName：logger名称,
 *  _SPDLOG_LEVEL_TYPE level：log级别, 
 * string msg：log消息内容
 * @return: 
 *  SPD_COMMON_SUCCEED                (0)   (LONG)通用错误码宏定义，值为0，表示成功
 *  SPD_COMMON_FAIL                   (-1)  (LONG)通用错误码宏定义，值为-1，表示一般错误
 *  SPD_COMMON_INVAILD                (-2)  (LONG)通用错误码宏定义，值为-2，表示无效参数
 */
int spdlogger_printf(std::string StrServerName, _SPDLOG_LEVEL_TYPE level, std::string msg);

/**
 * @name: spdlogger_printf
 * @msg: 通过pSpdloger发送log消息(高并发场合下推荐使用)
 * @param 
 * pSpdloger logger：logger，如果为nullptr场合下，则表示使用默认logger进行log发送,
 *  _SPDLOG_LEVEL_TYPE level：log级别, 
 * string msg：log消息内容
 * @return: 
 *  SPD_COMMON_SUCCEED                (0)   (LONG)通用错误码宏定义，值为0，表示成功
 *  SPD_COMMON_FAIL                   (-1)  (LONG)通用错误码宏定义，值为-1，表示一般错误
 *  SPD_COMMON_INVAILD                (-2)  (LONG)通用错误码宏定义，值为-2，表示无效参数
 */
int spdlogger_printf4logger(_SPDLOG_LEVEL_TYPE level, std::string msg, pSpdlogger logger = nullptr);

/**
 * @name: spdlogger_set_pattern
 * @msg: 设置指定的pattern
 * @param
 * string StrServerName：指定的logger，如果为""，则对全局设置该pattern, 
 * string setpattern：要设置的pattern，设定规则见下
 * 模式标记
    flag	meaning	example
    %v	The actual text to log	“some user text”
    %t	Thread id	“1232”
    %P	Process id	“3456”
    %n	Logger’s name	“some logger name”
    %l	The log level of the message	“debug”, “info”, etc
    %L	Short log level of the message	“D”, “I”, etc
    %a	Abbreviated weekday name	“Thu”
    %A	Full weekday name	“Thursday”
    %b	Abbreviated month name	“Aug”
    %B	Full month name	“August”
    %c	Date and time representation	“Thu Aug 23 15:35:46 2014”
    %C	Year in 2 digits	“14”
    %Y	Year in 4 digits	“2014”
    %D or %x	Short MM/DD/YY date	“08/23/14”
    %m	Month 1-12	“11”
    %d	Day of month 1-31	“29”
    %H	Hours in 24 format 0-23	“23”
    %I	Hours in 12 format 1-12	“11”
    %M	Minutes 0-59	“59”
    %S	Seconds 0-59	“58”
    %e	Millisecond part of the current second 0-999	“678”
    %f	Microsecond part of the current second 0-999999	“056789”
    %F	Nanosecond part of the current second 0-999999999	“256789123”
    %p	AM/PM	“AM”
    %r	12 hour clock	“02:55:02 pm”
    %R	24-hour HH:MM time, equivalent to %H:%M	“23:55”
    %T or %X	ISO 8601 time format (HH:MM:SS), equivalent to %H:%M:%S	“23:55:59”
    %z	ISO 8601 offset from UTC in timezone ([+/-]HH:MM)	“+02:00”
    %E	Seconds since the epoch	“1528834770”
    %i	Message sequence number (disabled by default - edit ‘tweakme.h’ to enable)	“1154”
    %%	The % sign	“%”
    %+	spdlog’s default format	“[2014-10-31 23:46:59.678] [mylogger] [info] Some message”
    %^	start color range	“[mylogger] [info(green)] Some message”
    %$	end color range (for example %1%$ %v)	[+++] Some message
    %@	Source file and line (use SPDLOG_TRACE(…),SPDLOG_INFO(…) etc.)	my_file.cpp:123
    %s	Source file (use SPDLOG_TRACE(…),SPDLOG_INFO(…) etc.)	my_file.cpp
    %#	Source line (use SPDLOG_TRACE(…),SPDLOG_INFO(…) etc.)	123
    %!	Source function (use SPDLOG_TRACE(…),SPDLOG_INFO(…) etc. see tweakme for pretty-print)	my_func
    对齐
    每一个模式标记可以通过预先添加一个宽度标记来对齐（上限128）

    使用-（左对齐）或者=（中间对齐）去控制向哪边对齐：

    align	meaning	example	result
    %<width><flag>	Align to the right	%8l	"    info"
    %-<width><flag>	Align to the left	%-8l	"info    "
    %=<width><flag>	Align to the center	%=8l	"  info  "
    ————————————————
    版权声明：本文为CSDN博主「haojie_superstar」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
    原文链接：https://blog.csdn.net/haojie_superstar/article/details/89383433
 * @return: 
 *  SPD_COMMON_SUCCEED                (0)   (LONG)通用错误码宏定义，值为0，表示成功
 *  SPD_COMMON_FAIL                   (-1)  (LONG)通用错误码宏定义，值为-1，表示一般错误
 *  SPD_COMMON_INVAILD                (-2)  (LONG)通用错误码宏定义，值为-2，表示无效参数
 */
int spdlogger_set_pattern(std::string setpattern,std::string StrServerName = "");

/**
 * @name: spdlogger_set_level
 * @msg: 通过StrServerName来设置level等级
 * @param 
 * _SPDLOG_LEVEL_TYPE level：log等级
 * std::string StrServerName：logger名字，如果为空，则对全局默认logger进行设置
 * @return: 
 */
int spdlogger_set_level(_SPDLOG_LEVEL_TYPE level,std::string StrServerName = "");

#endif
